package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.dto.DishDto;
import com.itheima.entity.Dish;
import com.itheima.entity.DishFlavor;
import com.itheima.entity.SetmealDish;
import com.itheima.mapper.DishMapper;
import com.itheima.service.DishFlavorService;
import com.itheima.service.DishService;
import com.itheima.service.SetmealService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
    @Autowired
    DishFlavorService dishFlavorService;
//因为有两个表要添加数据，开启事务管理可以保证第一个表插入异常时会出现事务回滚，保证不会继续执行
    //@Transactional注解在service接口使用更好
    @Override
    @Transactional
    public void saveWithFlavor(DishDto dishDto) {
        //先保存菜品dish的基本信息
        this.save(dishDto);

        Long id = dishDto.getId();
        List<DishFlavor> flavors = dishDto.getFlavors();
        //处理集合：foreach循环或者stream流
        //.stream()是将集合转化为流,.map是将流中的元素计算或者转换(此处用map为流中的dishid赋值),.collect是将流转为集合
        flavors.stream().map((item)->{
            item.setDishId(id);
            return item;
        }).collect(Collectors.toList());//相当于又转成list，但是元素进行了加工
        //flavors.forEach(item->item.setDishId(id));
        //保存菜品口味数据到表dish_flavor
        //保存菜品后,自动生成id,然后拿到id赋值给id属性再次封装
        dishFlavorService.saveBatch(dishDto.getFlavors());

    }

    @Override
    public DishDto getByIdWithFlavor(Long id) {
        //查询菜品基本信息
        Dish dish = this.getById(id);
        //复制菜品信息到有口味属性的dto中
        DishDto dishDto = new DishDto();
        BeanUtils.copyProperties(dish,dishDto);

        //查询当前菜品对应的口味信息
        LambdaQueryWrapper<DishFlavor> lqw=new LambdaQueryWrapper();
        lqw.eq(DishFlavor::getDishId,id);
        List<DishFlavor> flavors = dishFlavorService.list(lqw);

        //把口味信息赋值给dto
        dishDto.setFlavors(flavors);
        return dishDto;
    }

    @Override
    @Transactional //操作多次数据库，加事务注解，保证数据一致性
    public void updateWithFlavor(DishDto dishDto) {
        //更新dish表基本信息
        this.updateById(dishDto);//由于是子类，会自动转型成Dish

        //修改指定ID（要获取批量ID很麻烦）的思想，先删除该ID存在的口味数据，再新增ID对应的口味
        //添加当前提交过来的口味数据---dish_flavor表的insert操作
        //因为有多个口味，表数据不好对应，所以直接删除方便
        LambdaQueryWrapper<DishFlavor> lqw=new LambdaQueryWrapper<>();
        lqw.eq(DishFlavor::getDishId,dishDto.getId());
        dishFlavorService.remove(lqw);

        //插入数据
        List<DishFlavor> flavors = dishDto.getFlavors();
        flavors=flavors.stream().map((item)->{
            item.setDishId(dishDto.getId());
            return item;
        }).collect(Collectors.toList());

        //dishFlavorService.updateBatchById(flavors);这个只能根据口味ID修改，但我们要的是通过传输数据的菜品ID进行修改，但是flavors是口味数据，没有菜品ID
        //而且一个菜品ID对应多个数据，直接修改会产生覆盖
        dishFlavorService.saveBatch(flavors);

    }

    @Override
    @Transactional
    public void deleteWithFlavor(Long ids) {
        this.removeById(ids);
        LambdaQueryWrapper<DishFlavor> lqw=new LambdaQueryWrapper<>();
        lqw.eq(DishFlavor::getDishId,ids);
        dishFlavorService.remove(lqw);
     /*   //delete from setmeal_dish where setmeal_id in (1,2,3)
        LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.in(SetmealDish::getSetmealId,ids);
        //删除关系表中的数据----setmeal_dish
        setmealDishService.remove(lambdaQueryWrapper);*/
    }
}
